package nix.mall.content.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import nix.mall.common.pojo.EasyUITreeNode;
import nix.mall.common.pojo.NixMallResult;
import nix.mall.content.service.ContentCategoryService;
import nix.mall.mapper.ContentCategoryMapper;
import nix.mall.pojo.ContentCategory;
import nix.mall.pojo.ContentCategoryExample;
import nix.mall.pojo.ContentCategoryExample.Criteria;

@Service
public class ContentCategoryServiceImpl implements ContentCategoryService {

	@Autowired
	private ContentCategoryMapper contentCategoryMapper; 
	
	@Override
	public List<EasyUITreeNode> getContentCategoryList(long parentId) {
		// 根据parentId查询子节点列表
		ContentCategoryExample example = new ContentCategoryExample();
		Criteria criteria = example.createCriteria();
		criteria.andParentIdEqualTo(parentId);
		List<ContentCategory> list = contentCategoryMapper.selectByExample(example);
		List<EasyUITreeNode> resultList = new ArrayList<>();
		for (ContentCategory contentCategory : list) {
			EasyUITreeNode node = new EasyUITreeNode();
			node.setId(contentCategory.getId());
			node.setText(contentCategory.getName());
			node.setState(contentCategory.getIsParent() ? "closed" : "open");
			resultList.add(node);
		}
		return resultList;
	}

	@Override
	public NixMallResult addContentCategory(Long parentId, String name) {
		// 创建pojo对象
		ContentCategory contentCategory = new ContentCategory();
		// 补全对象属性
		contentCategory.setParentId(parentId);
		contentCategory.setName(name);
		// 状态：1 正常；2 删除；
		contentCategory.setStatus(1);
		// 排序：默认为1
		contentCategory.setSortOrder(1);
		contentCategory.setIsParent(false);
		contentCategory.setCreated(new Date());
		contentCategory.setUpdated(new Date());
		// 插入数据库
		contentCategoryMapper.insert(contentCategory);
		// 判断父节点的状态
		ContentCategory parent = contentCategoryMapper.selectByPrimaryKey(parentId);
		if (!parent.getIsParent()) {
			// isParent=false修改为isParent=true
			parent.setIsParent(true);
			parent.setUpdated(new Date());
			// 更新父节点
			contentCategoryMapper.updateByPrimaryKeySelective(parent);
		}
		// 返回结果
		return NixMallResult.ok(contentCategory);
	}
	
	@Override
	public NixMallResult editContentCategory(Long id, String name) {
		// 获得pojo对象
		ContentCategory contentCategory = contentCategoryMapper.selectByPrimaryKey(id);
		// 修改属性
		contentCategory.setName(name);
		contentCategory.setUpdated(new Date());
		// 更新数据库
		contentCategoryMapper.updateByPrimaryKeySelective(contentCategory);
		// 返回结果
		return NixMallResult.ok();
	}

	@Override
	public NixMallResult delContentCategory(Long id) {
		// 获得pojo对象
		ContentCategory contentCategory = contentCategoryMapper.selectByPrimaryKey(id);
		// 获得父对象
		ContentCategory parent = contentCategoryMapper.selectByPrimaryKey(contentCategory.getParentId());
		// 删除节点及其子节点
		delContentCategoryWithSub(id);		
		// 查询父节点的其他子节点
		ContentCategoryExample example = new ContentCategoryExample();
		Criteria criteria = example.createCriteria();
		criteria.andParentIdEqualTo(parent.getId());
		List<ContentCategory> list = contentCategoryMapper.selectByExample(example);
		// 更新父节点
		if (list.size() <= 0) {
			parent.setIsParent(false);
			parent.setUpdated(new Date());
			contentCategoryMapper.updateByPrimaryKeySelective(parent);
		}
		return NixMallResult.ok();
	}
	
	// 删除节点及其子节点递归方法
	private void delContentCategoryWithSub(Long id) {
		// 删除当前节点
		contentCategoryMapper.deleteByPrimaryKey(id);
		// 查询子节点
		ContentCategoryExample example = new ContentCategoryExample();
		Criteria criteria = example.createCriteria();
		criteria.andParentIdEqualTo(id);
		List<ContentCategory> list = contentCategoryMapper.selectByExample(example);
		// 判断
		if (list.size() > 0) {
			for (ContentCategory contentCategory : list) {
				delContentCategoryWithSub(contentCategory.getId());
			}
		}
	}
}
